package com.tarena.csmall.order.web.service;

import cn.tedu.mall.common.exception.CoolSharkServiceException;
import cn.tedu.mall.common.pojo.domain.CsmallAuthenticationInfo;
import cn.tedu.mall.common.restful.JsonPage;
import cn.tedu.mall.common.restful.ResponseCode;
import cn.tedu.mall.pojo.order.dto.CartAddDTO;
import cn.tedu.mall.pojo.order.dto.CartUpdateDTO;
import cn.tedu.mall.pojo.order.vo.CartStandardVO;
import cn.tedu.mall.pojo.product.vo.SkuStandardVO;
import com.tarena.csmall.front.api.sku.SkuApi;
import com.tarena.csmall.order.web.repository.CartRepository;
import java.util.ArrayList;
import java.util.List;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

@Service
public class CartService {
    @Autowired
    private CartRepository cartRepository;
    public void addCart(CartAddDTO dto) {
        //想办法 获取一下userId,如果没有userId 无法操作数据层
        //写一个假数据
        Long userId=getUserId();
        //hget userId skuId
        Integer quantity=cartRepository.getCartQuantity(userId,dto.getSkuId());
        if(quantity==null){
            //不存在当前购物车数据,新增操作
            //查询当前购物车容量
            Integer cartCapacity=cartRepository.getCartNum(userId);
            if (cartCapacity==20){
                //购物车已满,不能添加
                throw new CoolSharkServiceException(ResponseCode.BAD_REQUEST,"购物车已满,不能添加");
            }else {
                //购物车未满,新增操作
                cartRepository.addCart(userId,dto.getSkuId(),dto.getQuantity());
            }
        }else {
            //存在当前购物车数据,更新操作
            //将新增进来的数量和查询到的数量相加
            Integer editQuantity=quantity+dto.getQuantity();
            if (editQuantity>200){
                //购物车某个商品数量不能大于200
                throw new CoolSharkServiceException(ResponseCode.BAD_REQUEST,"购物车某个商品数量不能大于200");
            }else{
                //更新数量 hset userId skuId editQuantity
                cartRepository.updateCartNum(userId,dto.getSkuId(),editQuantity);
            }
        }
    }

    private Long getUserId() {
        //从security上下文获取认证对象
        //只要现在请求,经历了认证环节
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        //知道这个认证对象的具体类型的
        UsernamePasswordAuthenticationToken auth=(UsernamePasswordAuthenticationToken) authentication;
        //拿到用户信息对象
        CsmallAuthenticationInfo userInfo = (CsmallAuthenticationInfo) auth.getPrincipal();
        return userInfo.getId();
    }
    //skuApi的接口 可以有，可以没有码
    //skuApi接口不存在 order代码如何调用
    @DubboReference
    private SkuApi skuApi;
    public JsonPage<CartStandardVO> queryMyCarts() {
        //从redis获取全部 userId对应的购物车
        //skuId1=quantity1 skuId2=quantity2..
        //获取userId
        Long userId = getUserId();
        //获取全部购物车数据
        List<CartStandardVO> carts=cartRepository.getMyCarts(userId);
        if (carts==null || carts.size()==0){
            throw new CoolSharkServiceException(ResponseCode.BAD_REQUEST,"购物车为空");
        }
        //数据不完整,需要dubbo远程调用 传递 skuId[] 返回SkuStandardVO[]足够了
        //传递的是一个批量ids
        List<Long> skuIds=new ArrayList<>();
        for (CartStandardVO cart : carts) {
            Long skuId=cart.getSkuId();
            skuIds.add(skuId);
        }
        List<SkuStandardVO> standardVOS = skuApi.batchGetSkus(skuIds);
        for(int i=0;i<standardVOS.size();i++){
            CartStandardVO cart = carts.get(i);
            SkuStandardVO sku = standardVOS.get(i);
            //title barcode price data imagePicture
            cart.setTitle(sku.getTitle());
            cart.setBarCode(sku.getBarCode());
            cart.setPrice(sku.getPrice());
            //http://image.com/1.png,http://image.com/2.png
            String pictures = sku.getPictures();
            if (pictures!=null){
                String mainPicture= pictures.split(",")[0];
                cart.setMainPicture(mainPicture);
            }
        }
        //在业务层包装到一个分页对象中
        return JsonPage.defaultPage(carts);
    }

    public void updateNum(CartUpdateDTO dto) {
        //解析userId和skuId
        String[] split = dto.getId().split(":");
        Long userId=Long.valueOf(split[0]);
        Long skuId=Long.valueOf(split[1]);
        cartRepository.updateCartNum(userId,skuId,dto.getQuantity());
    }

    public void deleteOrderCart(Long userId, List<Long> skuIds) {
        cartRepository.deleteOrderCart(userId,skuIds);
    }
}
